package org.jeeasy.generate.generator;

import cn.hutool.core.text.NamingCase;
import lombok.Getter;

/**
 * 用于转换字符串为其他类型的案例风格的类。
 */
@Getter
public class CaseName {

    private final String base;

    /**
     * 下划线风格的字符串
     * hello_world
     */
    private final String underline;
    /**
     * 大驼峰风格的字符串
     * HelloWorld
     */
    private final String pascal;
    /**
     * 小驼峰风格的字符串
     * helloWorld
     */
    private final String camel;
    /**
     * 短横线风格的字符串
     * hello-world
     */
    private final String kebab;

    /**
     * 构造函数，根据给定的字符串base初始化各种案例风格的字符串。
     *
     * @param base 需要转换的字符串
     */
    public CaseName(String base) {
        this.base = base;
        this.underline = NamingCase.toUnderlineCase(base.replaceAll("-", "_"));
        this.pascal = NamingCase.toPascalCase(this.underline);
        this.camel = NamingCase.toCamelCase(this.underline);
        this.kebab = NamingCase.toKebabCase(this.camel);
    }

    /**
     * 将给定的字符串转换为下划线风格的字符串。
     *
     * @param str 需要转换的字符串
     * @return 下划线风格的字符串
     */
    public static String toUnderline(String str) {
        return new CaseName(str).getUnderline();
    }

    /**
     * 将给定的字符串转换为大驼峰风格的字符串。
     *
     * @param str 需要转换的字符串
     * @return 大驼峰风格的字符串
     */
    public static String toPascal(String str) {
        return new CaseName(str).getPascal();
    }

    /**
     * 将给定的字符串转换为小驼峰风格的字符串。
     *
     * @param str 需要转换的字符串
     * @return 小驼峰风格的字符串
     */
    public static String toCamel(String str) {
        return new CaseName(str).getCamel();
    }

    /**
     * 将给定的字符串转换为短横线风格的字符串。
     *
     * @param str 需要转换的字符串
     * @return 短横线风格的字符串
     */
    public static String toKebab(String str) {
        return new CaseName(str).getKebab();
    }
}

